#include "standard.h"
#include "interface_ada.h"
#include <time.h>

using namespace std;

// Createur de Standard
Standard::Standard(int id)
{
	this->id=id;
}

// Permet a un poste de se connecter au reseau
void Standard::connecter(int num)
{
// -1 n'existe pas
// 0  existe mais n'est pas connecte
// 1 est connecte
	Annuaire::Annuaire * pagesJaunes = Annuaire::getInstance();
	Annuaire::client client_temp;
	if(pagesJaunes->getEstConnecte(num) == -1){
		cout << "C++ >> Le client que vous voulez connecte n'existe pas !"<< endl;
	} else if(pagesJaunes->getEstConnecte(num) == 1){
		cout << "C++ >> Le client que vous voulez connecte est deja connecte"<< endl;
	} else if(pagesJaunes->getEstConnecte(num) == 0){
		client_temp = pagesJaunes->recupererCompteClient(num);
		client_temp.estConnecte = 1;
		pagesJaunes->modifier(num, client_temp);
		cout << "C++ >> Le client est maintenant connecte"<< endl;
	}	
}

// Permet a un poste de se deconnecter du reseau
void Standard::deconnecter(int num)
{
	Annuaire::Annuaire * pagesJaunes = Annuaire::getInstance();	
	Annuaire::client client_temp;

	if(pagesJaunes->getEstConnecte(num) == -1){
		cout << "C++ >> Le client que vous voulez connecte n'existe pas !"<< endl;
	} else if(pagesJaunes->getEstConnecte(num) == 0){
		cout << "C++ >> Le client que vous voulez connecte est deja deconnecte"<< endl;
	} else if(pagesJaunes->getEstConnecte(num) == 1){
		client_temp = pagesJaunes->recupererCompteClient(num);
		client_temp.estConnecte = 0;
		pagesJaunes->modifier(num, client_temp);
		cout << "C++ >> Le client est maintenant deconnecte"<< endl;
	}
	
}

// Permet a un poste de demander une communication.
void Standard::demanderCommunication(int num,char * host,int & port)
{	Annuaire::Annuaire * pagesJaunes = Annuaire::getInstance();
	Central::Central * central = Central::getInstance();
	int portDeCommunication=99999;

	host="localhost";
	if(pagesJaunes->getEstConnecte(num) == -1){
		cout << "C++ >> Le client que vous voulez connecte n'existe pas ! "<< endl;
	} else if(pagesJaunes->getEstConnecte(num) == 0){
		cout << "C++ >> Le client que vous voulez connecte n'est pas connecte"<< endl;
	} else if(pagesJaunes->getEstConnecte(num) == 1){
		portDeCommunication=central->etablir_connexion();
	}	
	port= portDeCommunication;	
}

// Permet a un poste d'interrompre une communication
void Standard::fermerCommunication(int port)
{	
	Central::Central * central = Central::getInstance();
	central->liberer_connexion(port);
	cout << "C++ >> Le port " << port << " est libere'" <<endl;
}

// Transmet un message a un poste.
Annuaire::messagerie Standard::transmettreMessage(int num)
{
	Annuaire::Annuaire * pagesJaunes = Annuaire::getInstance();
	Annuaire::messagerie messagerie_tmp;
	Annuaire::client client_tmp;
	client_tmp=pagesJaunes->recupererCompteClient(num);
	if(client_tmp.num == 0){
		cout <<"C++ >> Le client n'existe pas" <<endl;	
	}else{
		messagerie_tmp = client_tmp.sms;
	}
	
	return messagerie_tmp;
}

// Permet a un poste de consulter son repondeur.
Annuaire::repondeur Standard::consulterRep(int num)
{
	Annuaire::Annuaire * pagesJaunes = Annuaire::getInstance();
	Annuaire::repondeur repondeur_tmp;
	Annuaire::client client_tmp;
	client_tmp=pagesJaunes->recupererCompteClient(num);
	if(client_tmp.num == 0){
		cout <<"C++ >> Le client n'existe pas" <<endl;	
	}else{
		repondeur_tmp = client_tmp.rep;
	}
	
	return repondeur_tmp;
}

// Permet a un agent commercial d'abonner un client
int Standard::abonner(	char* adresse,
			bool estMobile,
			bool repActif,
			bool messActif,
			bool transfertActif,
			int numTrans,
			int abonnement,
			char* infoComptable)
{	
	srand((unsigned) time(NULL));
	Annuaire::client cli;
	bool genere =false;
	Annuaire::Annuaire * pagesJaunes = Annuaire::getInstance();
	cli=pagesJaunes->initStructClient();
	cli.adresse = adresse;
	cli.estMobile=estMobile;
	cli.repondeurActif = repActif;
	cli.messagerieActive = messActif;
	cli.transfertActif = transfertActif;
	cli.numTransfert = numTrans;
	cli.typeAbonnement = abonnement;
	cli.infoComptable = infoComptable;
	while(!genere){
		cli.num = rand()%100;
		if(pagesJaunes->rechercher(cli.num)==-1)
		{
			genere=true;
		}
	}
	pagesJaunes->ajouter(cli);
	pagesJaunes = Annuaire::getInstance();
	return cli.num;
}

// Permet a un agent commercial de resilier l'abonnement d'un client
void Standard::desabonner(int num)
{
	Annuaire::Annuaire * pagesJaunes = Annuaire::getInstance();
	pagesJaunes->rechercher(num);
	
}

// Permet a un agent commercial de modifier le compte d'un client
void Standard::modifier_abonnement(int num,
			char* adresse,
			bool estMobile,
			bool repActif,
			bool messActif,
			bool transfertActif,
			int numTrans,
			int abonnement,
			char* infoComptable)
{
	Annuaire::client cli;
	Annuaire::Annuaire * pagesJaunes = Annuaire::getInstance();
	cli = pagesJaunes->recupererCompteClient(num);
	cli.adresse = adresse;
	cli.estMobile=estMobile;
	cli.repondeurActif = repActif;
	cli.messagerieActive = messActif;
	cli.transfertActif = transfertActif;
	cli.numTransfert = numTrans;
	cli.typeAbonnement = abonnement;
	cli.infoComptable = infoComptable;
	
	pagesJaunes->modifier(num, cli);
	
}

void Standard::setId(int id)
{
	this->id=id;
}

int Standard::getId()
{
	return this->id;
}

